/*
 * @Author: scl
 * @Date: 2023-08-08 21:21:12
 * @LastEditTime: 2023-08-09 10:24:34
 * @Description: file content
 */
/*
 * @lc app=leetcode.cn id=16 lang=typescript
 *
 * [16] 最接近的三数之和
 *
 * https://leetcode.cn/problems/3sum-closest/description/
 *
 * algorithms
 * Medium (45.05%)
 * Likes:    1488
 * Dislikes: 0
 * Total Accepted:    502.3K
 * Total Submissions: 1.1M
 * Testcase Example:  '[-1,2,1,-4]\n1'
 *
 * 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数，使它们的和与 target 最接近。
 * 
 * 返回这三个数的和。
 * 
 * 假定每组输入只存在恰好一个解。
 * 
 * 
 * 
 * 示例 1：
 * 
 * 
 * 输入：nums = [-1,2,1,-4], target = 1
 * 输出：2
 * 解释：与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
 * 
 * 
 * 示例 2：
 * 
 * 
 * 输入：nums = [0,0,0], target = 1
 * 输出：0
 * 
 * 
 * 
 * 
 * 提示：
 * 
 * 
 * 3 <= nums.length <= 1000
 * -1000 <= nums[i] <= 1000
 * -10^4 <= target <= 10^4
 * 
 * 
 */

// @lc code=start
function threeSumClosest(nums: number[], target: number): number {
    let min = null;
    const arr = new Set(nums);
    nums.sort((a, b) => a - b);
    for (let item of arr) {
        let l = nums.indexOf(item) + 1, r = nums.length - 1;
        while (l < r) {
            if (min != null) {
                min = Math.abs(item + nums[l] + nums[r] - target) > Math.abs(min - target) ? min : item + nums[l] + nums[r];
                if(item + nums[l] + nums[r] > target)r-- 
                else l++
            }
            else if (item + nums[l] + nums[r] == target) {
                return target;
            }
            else {
                min = item + nums[l] + nums[r];
            }
        }
    }
    return min;
};
// @lc code=end

